//******************************************************************
//******************************************************************
//**********          ANts Peer To Peer Sources        *************
//
// ANts P2P realizes a third generation P2P net. It protects your
// privacy while you are connected and makes you not trackable, hiding
// your identity (ip) and crypting everything you are sending/receiving
// from others.

// Copyright (C) 2004  Roberto Rossi

// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.


package ants.p2p;

import org.apache.log4j.*;

public class SenderThread extends Thread{
  Message m;
  Neighbour n;

  public static int queryQueueLimit = 30;
  public static int queueLimit = 100;

  public static final int waitTime = 8;

  static Logger _logger = Logger.getLogger(SenderThread.class.getName());

  private boolean send = true;

  public SenderThread(Message m, Neighbour n){
    this.m = m;
    this.n = n;
    this.setPriority(10);
  }

  public void run(){
    try{
      if(n.getQueuedMessages() > SenderThread.queryQueueLimit && m instanceof ants.p2p.query.QueryMessage && (m.getType() == 2 || m.getType() == 0)){
        _logger.debug(n.getIdent()+" Neighbour stuck [too many queued messages: "+n.getQueuedMessages()+"]. Dircarding query...");
        return;
      }
      else if(n.getQueuedMessages() > SenderThread.queueLimit){
        _logger.debug(n.getIdent()+" Neighbour stuck [too many queued messages: "+n.getQueuedMessages()+"]. Dircarding message...");
        return;
      }
      /*if(!this.n.getAnt().acceptTCPDirectConnections() && this.m.getSource().equals(this.n.getAnt().getIdent())){
        int mSeconds = (int) (Math.floor(Math.random() * waitTime) * 1000) + 2000;
        sleep(mSeconds);
      }*/
      n.incQueuedMessages();
      //_logger.info(n.toString()+"  Sending [synchronous_"+n.getQueuedMessages()+"] " + m);
      n.send(m);
      n.decQueuedMessages();
      //_logger.info(n.toString()+"  Sent [synchronous_"+n.getQueuedMessages()+"] " + m);
    }catch(Exception e){
      _logger.error("Error in sending packet through Socket",e);
      n.decQueuedMessages();
    }
  }

  public void interruptSending(){
    this.send = false;
  }

  public boolean mustSend(){
    return this.send;
  }
}
